package com.ohimy.service.impl;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Service;

import com.ohimy.dao.impl.InfoItemCommentDao;
import com.ohimy.dao.impl.InfoItemDao;
import com.ohimy.dao.impl.InfoSortDao;
import com.ohimy.dao.impl.InfoSubSortDao;
import com.ohimy.entity.InfoItem;
import com.ohimy.entity.InfoItemComment;
import com.ohimy.entity.InfoSort;
import com.ohimy.entity.InfoSubSort;

@Service("infoService")
public class InfoService {

	@Resource(name = "infoSortDao")
	private InfoSortDao infoSortDao;

	@Resource(name = "infoSubSortDao")
	private InfoSubSortDao infoSubSortDao;

	@Resource(name = "infoItemDao")
	private InfoItemDao infoItemDao;

	@Resource(name = "infoItemCommentDao")
	private InfoItemCommentDao infoItemCommentDao;

	/**
	 * 得到所有栏目
	 * 
	 * @return
	 */
	public List<InfoSort> getAllInfoSort() {
		return infoSortDao.findAll();
	}

	/**
	 * 通过id得到栏目
	 * 
	 * @param id
	 * @return
	 */
	public InfoSort getInfoSort(long id) {
		return infoSortDao.load(id);
	}

	/**
	 * 新建一个栏目
	 * 
	 * @param newsSort
	 */
	public void insertInfoSort(InfoSort infoSort) {
		infoSortDao.save(infoSort);
	}

	/**
	 * 更新一个栏目
	 * 
	 * @param newsSort
	 */
	public void updateInfoSort(InfoSort infoSort) {
		infoSortDao.update(infoSort);
	}

	/**
	 * 删除一个栏目
	 * 
	 * @param newsSort
	 */
	public void deleteInfoSort(long id) {
		infoSortDao.delete(infoSortDao.load(id));
	}

	// //////////////////////////

	/**
	 * 通过id得到二级栏目
	 * 
	 * @param id
	 * @return
	 */
	public List<InfoSubSort> getAllInfoSubSort(long id) {
		DetachedCriteria criteria = DetachedCriteria
				.forClass(InfoSubSort.class);
		criteria.add(Restrictions.eq("infoSort", infoSortDao.load(id)));
		return infoSubSortDao.findByCriteria(criteria);
	}

	/**
	 * 通过id得到二级栏目
	 * 
	 * @param id
	 * @return
	 */
	public InfoSubSort getInfoSubSort(long id) {
		return infoSubSortDao.load(id);
	}

	/**
	 * 新建一个二级栏目
	 * 
	 * @param newsSort
	 */
	public void insertInfoSubSort(InfoSubSort infoSubSort) {
		infoSubSortDao.save(infoSubSort);
	}

	/**
	 * 更新一个二级栏目
	 * 
	 * @param newsSort
	 */
	public void updateInfoSubSort(InfoSubSort infoSubSort) {
		infoSubSortDao.update(infoSubSort);
	}

	/**
	 * 删除一个二级栏目
	 * 
	 * @param newsSort
	 */
	public void deleteInfoSubSort(long id) {
		infoSubSortDao.delete(infoSubSortDao.load(id));
	}

	// /////////////////
	/**
	 * 得到所有资讯
	 * 
	 * @return
	 */
	public List<InfoItem> getAllInfoItem() {
		return infoItemDao.findAll();
	}

	/**
	 * 通过一级目录ID得到所有资讯
	 * 
	 * @return
	 */
	public List<InfoItem> getItemBySortId(long id) {
		List<InfoItem> infoItemList = new ArrayList<InfoItem>();
		List<InfoSubSort> list = infoSortDao.load(id).getInfoSubSort();
		Criterion[] criterions = new Criterion[1];
		// 迭代出所有二级目录
		for (InfoSubSort infoSubSort : list) {
			criterions[0] = Restrictions.eq("infoSubSort", infoSubSortDao
					.load(infoSubSort.getId()));
			// 通过二级目录 迭代出所有资讯
			for (InfoItem infoItem : infoItemDao.findByCriteria(0, 15, null,
					criterions))
				infoItemList.add(infoItem);
		}
		return infoItemList;
	}

	/**
	 * 通过id得到资讯
	 * 
	 * @param id
	 * @return
	 */
	public InfoItem getInfoItem(long id) {
		return infoItemDao.load(id);
	}

	/**
	 * 查看资讯的分页
	 * 
	 * @param id
	 * @param firstResult
	 * @param maxResults
	 * @return
	 */
	public List<InfoItem> getAllInfoItemByPager(int firstResult, int maxResult) {
		return infoItemDao.findByCriteria(firstResult, maxResult, Order
				.desc("id"));
	}

	/**
	 * 新建一个资讯
	 * 
	 * @param newsSort
	 */
	public void insertInfoItem(InfoItem infoItem) {
		infoItemDao.save(infoItem);
	}

	/**
	 * 更新一个资讯
	 * 
	 * @param newsSort
	 */
	public void updateInfoItem(InfoItem infoItem) {
		infoItemDao.update(infoItem);
	}

	/**
	 * 删除一个资讯
	 * 
	 * @param newsSort
	 */
	public void deleteInfoItem(long id) {
		infoItemDao.delete(infoItemDao.load(id));
	}

	/**
	 * 返回资讯总条数
	 * 
	 * @return
	 */
	public long getInfoItemCount() {
		return infoItemDao.findAll().size();
	}

	// /////////////////
	/**
	 * 得到所有资讯评论
	 * 
	 * @return
	 */
	public List<InfoItemComment> getAllInfoComment() {
		return infoItemCommentDao.findAll();
	}

	/**
	 * 通过id得到资讯评论
	 * 
	 * @param id
	 * @return
	 */
	public InfoItemComment getInfoComment(long id) {
		return infoItemCommentDao.load(id);
	}

	/**
	 * 查看资讯评论的分页
	 * 
	 * @param id
	 * @param firstResult
	 * @param maxResults
	 * @return
	 */
	public List<InfoItemComment> getAllInfoCommentByPager(long id,
			int firstResult, int maxResult) {
		Criterion[] criterions = new Criterion[] { Restrictions.eq("infoItem",
				infoItemDao.load(id)) };
		return infoItemCommentDao.findByCriteria(firstResult, maxResult, Order
				.desc("id"), criterions);
	}

	/**
	 * 新建一个资讯评论
	 * 
	 * @param newsSort
	 */
	public void insertInfoComment(InfoItemComment infoItemComment) {
		infoItemCommentDao.save(infoItemComment);
	}

	/**
	 * 更新一个资讯评论
	 * 
	 * @param newsSort
	 */
	public void updateInfoComment(InfoItemComment infoItemComment) {
		infoItemCommentDao.update(infoItemComment);
	}

	/**
	 * 删除一个资讯评论
	 * 
	 * @param newsSort
	 */
	public void deleteInfoComment(long id) {
		infoItemCommentDao.delete(infoItemCommentDao.load(id));
	}

	/**
	 * 返回资讯总条数
	 * 
	 * @return
	 */
	public long getInfoCommentCount(long id) {
		Criterion[] criterions = new Criterion[] { Restrictions.eq("infoItem",
				infoItemDao.load(id)) };
		return infoItemCommentDao.findByCriteria(criterions).size();
	}

	/**
	 * 用户自定义查询
	 * 
	 * @param id
	 * @param firstResult
	 * @param maxResults
	 * @return
	 */
	public List<InfoItem> findInfoByPager(long id, long sub, InfoItem infoItem,
			int firstResult, int maxResult, Order order) {
		if (sub == 0) {
			return this.getItemBySortId(id);
		} else {
			// 对字段的为空处理
			if (null == infoItem.getAddress())
				infoItem.setAddress("");
			if (null == infoItem.getIntro())
				infoItem.setIntro("");
			Criterion[] criterions = new Criterion[] {
					Restrictions.eq("infoSubSort", infoSubSortDao.load(sub)),
					Restrictions.like("address", infoItem.getAddress(),
							MatchMode.ANYWHERE),
					Restrictions.like("intro", infoItem.getIntro(),
							MatchMode.ANYWHERE) };
			return infoItemDao.findByCriteria(firstResult, maxResult, order,
					criterions);
		}
	}

	/**
	 * 用户自定义查询返回的条数
	 * 
	 * @param id
	 * @param infoItem
	 * @param firstResult
	 * @param maxResult
	 * @param order
	 * @return
	 */
	public long findInfoByPagerCount(long id, long sub, InfoItem infoItem) {
		if (sub == 0) {
			return this.getItemBySortId(id).size();
		} else {
			// 对字段的为空处理
			if (null == infoItem.getAddress())
				infoItem.setAddress("");
			if (null == infoItem.getIntro())
				infoItem.setIntro("");
			Criterion[] criterions = new Criterion[] {
					Restrictions.eq("infoSubSort", infoSubSortDao.load(sub)),
					Restrictions.like("address", infoItem.getAddress(),
							MatchMode.ANYWHERE),
					Restrictions.like("intro", infoItem.getIntro(),
							MatchMode.ANYWHERE) };
			return infoItemDao.findByCriteria(criterions).size();
		}
	}

	public long findTest(long id, long sub, InfoItem infoItem) {
		System.out.println(infoItem.getAddress());
		Criterion[] criterions = new Criterion[] {
				Restrictions.eq("infoSubSort", infoSubSortDao.load(sub)),
				Restrictions.like("address", "%" + infoItem.getAddress() + "%") };
		return infoItemDao.findByCriteria(criterions).size();
	}

	/* *************************************** */
	public void setInfoSortDao(InfoSortDao infoSortDao) {
		this.infoSortDao = infoSortDao;
	}

	public void setInfoSubSortDao(InfoSubSortDao infoSubSortDao) {
		this.infoSubSortDao = infoSubSortDao;
	}

	public void setInfoItemDao(InfoItemDao infoItemDao) {
		this.infoItemDao = infoItemDao;
	}

	public void setInfoItemCommentDao(InfoItemCommentDao infoItemCommentDao) {
		this.infoItemCommentDao = infoItemCommentDao;
	}

}
